package com.changgou.order.service.impl;

import com.changgou.goods.feign.SkuFeign;
import com.changgou.goods.feign.SpuFeign;
import com.changgou.goods.pojo.Sku;
import com.changgou.goods.pojo.Spu;
import com.changgou.order.pojo.OrderItem;
import com.changgou.order.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 购物车 功能方法实现类
 * @author 20201117
 */
@Service
public class CartServiceImpl implements CartService {

    private final String CART="cart_";

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private SkuFeign skuFeign;

    private SpuFeign spuFeign;
    @Autowired
    public CartServiceImpl(SpuFeign spuFeign){
        this.spuFeign = spuFeign;
    }



    /**
     * 添加购物车
     * @param skuId 商品id
     * @param num 商品数量
     * @param username  用户唯一标识
     */
    @Override
    public void add(String skuId, Integer num, String username) {

        /**
         * 使用的 redis 的 数据存储结构 ：  key  field  value   ==  key  map(key,value)
         *  field 相当于 skuId  value 即 orderItem 数据,  key  即  CART + username
         *  详情 看 redis 的 教学回放  或者 笔记
         */
        OrderItem orderItem= (OrderItem) redisTemplate.boundHashOps(CART + username).get(skuId);

        //1. 根据 商品 id  查询 redis缓存中，是否 已经添加该商品的信息
        if (orderItem != null){
            //2. 若 已经添加，则更新 商品信息的数量 以及价格
            orderItem.setNum(orderItem.getNum()+num);
            // 如果商品数量等于0，则从缓存中，删除该购物车的商品信息
            if (orderItem.getNum() <= 0){
                redisTemplate.boundHashOps(CART+username).delete(skuId);
                return;
            }
            orderItem.setMoney(orderItem.getPrice() * orderItem.getNum());
            orderItem.setPayMoney(orderItem.getPrice() * orderItem.getNum());
        }else {
            //3. 若 没有添加，则将 该商品信息存储到redis 中
            Sku sku = skuFeign.findById(skuId).getData();
            Spu spu = spuFeign.findBySpuId(sku.getSpuId()).getData();
            orderItem = this.sku2OrderItem(sku,spu,num);
        }

        //4. 存入 redis 缓存中
        redisTemplate.boundHashOps(CART+username).put(skuId,orderItem);




    }

    /**
     *
     * @param username 用户唯一标识
     * @return
     */
    @Override
    public Map list(String username) {
        Map resultMap = new HashMap();
        Integer totalNum = 0;
        Integer totalPrice = 0;

        List<OrderItem> orderItemList=  redisTemplate.boundHashOps(CART + username).values();
        for (OrderItem orderItem : orderItemList) {
            totalNum+=orderItem.getNum();
            totalPrice+=orderItem.getMoney();
        }
        resultMap.put("orderItemList",orderItemList);
        resultMap.put("totalNum",totalNum);
        resultMap.put("totalPrice",totalPrice);

        return resultMap;
    }

    /**
     * 将 sku 、spu 的相关信息 封装到 orderItem 中
     * @param sku 商品信息
     * @param spu  spu信息
     * @param num 数量
     * @return orderItem分装类
     */
    private OrderItem sku2OrderItem(Sku sku, Spu spu, Integer num) {
        OrderItem orderItem = new OrderItem();
        //设置分类信息
        orderItem.setCategoryId1(spu.getCategory1Id());
        orderItem.setCategoryId2(spu.getCategory2Id());
        orderItem.setCategoryId3(spu.getCategory3Id());
        //设置 sku 的相关信息
        orderItem.setName(sku.getName());
        orderItem.setSpuId(spu.getId());
        orderItem.setSkuId(sku.getId());
        orderItem.setPrice(sku.getPrice());
        //总金额
        orderItem.setMoney(orderItem.getPrice() * num );
        //实付金额
        orderItem.setPayMoney(orderItem.getPrice() * num);
        orderItem.setImage(sku.getImage());
        //总重量
        orderItem.setWeight(sku.getWeight() * num);
        orderItem.setNum(num);
        return orderItem;
    }
}
